package com.example.springboot.controller;

import cn.hutool.core.io.FileUtil;
import com.example.springboot.common.Result;
import com.example.springboot.exception.CustomerException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;

@RestController
@RequestMapping("/files")
public class FileController {
    @PostMapping("/upload")
    public Result upload(@RequestParam("file") MultipartFile file) throws Exception {
        // 动态获取项目根目录（D:\1项目\Appointment）
        String projectRoot = new File("..").getCanonicalPath(); // 方法1
        // 找到文件的位置
        String filePath = projectRoot + "/files/"; // 获取当前项目的根路径(code2025的绝对路径 D:\1项目\毕设练习\代码\code2025)
        if (!FileUtil.isDirectory(filePath)){
            FileUtil.mkdir(filePath);
        }
        byte[] bytes = file.getBytes();
        String fileName = System.currentTimeMillis() + "_" + file.getOriginalFilename(); // 文件的原始名称
        //写入文件
        FileUtil.writeBytes(bytes,filePath + fileName);
        String url = "/files/download/" + fileName;
        return Result.success(url);
    }


    /**
     * 文件下载
     * 下载地址: http://localhost:8888/files/download/404.jpg
     */
    @GetMapping("/download/{fileName}")
    public void download(@PathVariable String fileName, HttpServletResponse response) throws Exception {
        // 动态获取项目根目录（D:\1项目\Appointment）
        String projectRoot = new File("..").getCanonicalPath(); // 方法1
        // 找到文件的位置
        String filePath = projectRoot + "/files/"; // 获取当前项目的根路径(code2025的绝对路径 D:\1项目\毕设练习\代码\code2025)
        String realPath = filePath + fileName; // D:\1项目\毕设练习\代码\code2025\files\404.jpg
        boolean exist = FileUtil.exist(realPath);
        if (!exist){
            throw new CustomerException("文件不存在");
        }
        // 读取文件的字节流
        byte[] bytes = FileUtil.readBytes(realPath);
        ServletOutputStream os = response.getOutputStream();
        //输出流对象，把文件写出到客户端
        os.write(bytes);
        os.flush();
        os.close();
    }
}
